wifi-scripts: fix broken match all case for wifi-vlan
authorRany Hany <[email protected]>
Sat, 29 Nov 2025 10:37:22 +0000 (12:37 +0200)
committerRobert Marko <[email protected]>
Mon, 15 Dec 2025 11:30:15 +0000 (12:30 +0100)
When iface is omitted, wifi-vlan will apply to all interfaces.
However, netifd.set_vlan call is not successful as it assumes
that every wifi-vlan section corresponds to one VIF.

For this reason in the wifi-vlan case (cur_type == "vlan")
we create a composite key in the form `${vif.name}/${vlan.name}`
allowing the same vlan section to correspond to multiple VAPs.
`/` was decided as a delimiter as it is an invalid character
for a network interface name and UCI identifier; so it is
impossible for it to cause conflicts.

It was verified that the `ubus call network.wireless status`
works as expected with this change. Moreover, wifi-station
is not susceptible to this problem.

This also means that it is now possible for wifi-vlan
to support `list` iface similar to old shell-based wifi-scripts.
This will be done in a follow-up commit.

Fixes: 98435a37a7 ("wifi-scripts: iface should be optional in wifi-vlan definition")
Signed-off-by: Rany Hany <[email protected]>
Link: https://github.com/openwrt/openwrt/pull/20977
Signed-off-by: Robert Marko <[email protected]>
package/network/config/wifi-scripts/files/lib/netifd/wireless-device.uc

index cccb6c9c8c3b2667377635ed887ba68d9b7d6495..428db6ee6af0c23b14e1bcab66deea3c5ec339c3 100644 (file)
@@ -488,7 +488,11 @@ function wdev_set_data(wdev, vif, vlan, data)
                cur_type = "vlan";
        }
 
-       wdev.handler_data[cur.name] = {
+       let key = cur.name;
+       if (cur_type == "vlan")
+               key = vif.name + "/" + vlan.name;
+
+       wdev.handler_data[key] = {
                ...cur,
                ...data,
                type: cur_type,
@@ -545,9 +549,13 @@ function hotplug(name, add)
        }
 }
 
-function get_status_data(wdev, vif)
+function get_status_data(wdev, vif, parent_vif)
 {
-       let hdata = wdev.handler_data[vif.name];
+       let key = vif.name;
+       if (parent_vif)
+               key = parent_vif.name + "/" + vif.name;
+
+       let hdata = wdev.handler_data[key];
        let data = {
                section: vif.name,
                config: vif.config
@@ -561,7 +569,7 @@ function get_status_vlans(wdev, vif)
 {
        let vlans = [];
        for (let vlan in vif.vlan)
-               push(vlans, get_status_data(wdev, vlan));
+               push(vlans, get_status_data(wdev, vlan, vif));
        return vlans;
 }